package com.xiachufang.app.controller;

import cn.hutool.core.io.FileUtil;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;

@RestController
@RequestMapping("/files")
public class FileController {
    private static final String BASE_PATH = System.getProperty("user.dir") + "/files/";

    /**
     * 文件上传接口
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public String upload(MultipartFile file) throws IOException {
        if (file == null) {
            return "";
        }

        long flag = System.currentTimeMillis();
        // 文件存储的路径
        File savePath = new File(BASE_PATH + flag + file.getOriginalFilename());
        // 判断如果父目录不存在，则创建一个
        if (!savePath.getParentFile().exists()) {
            savePath.getParentFile().mkdirs();
        }
        // 文件存储
        file.transferTo(savePath);
        return "http://localhost:9000/files/" + flag;
    }

    /**
     * 文件下载接口
     * @param flag
     * @param response
     */
    @GetMapping("/{flag}")
    public void download(@PathVariable String flag, HttpServletResponse response) {
        // 读取文件目录下的所有文件名称
        List<String> fileNames = FileUtil.listFileNames(BASE_PATH);
        // ifPresent表示存在一个这样名称的文件
        fileNames.stream().filter(name -> name.contains(flag)).findFirst().ifPresent(fileName -> {

            OutputStream os = null;
            try {
                // 根据文件的路径new 一个file对象
                File file = new File(BASE_PATH + fileName);
                // 读取文件的字节数组
                byte[] bytes = FileUtil.readBytes(file);

                // 设置输出流下载格式
                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
                response.addHeader("Content-Length", "" + file.length());
                response.setContentType("application/octet-stream");

                os = response.getOutputStream();
                // 把文件的字节数组写出到 输出流对象
                os.write(bytes);
                os.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭输出流对象
                try {
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }
}
